#include<stdio.h>
#include<unistd.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<string.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<sys/types.h>
#include<errno.h>
#include <netdb.h>
#include<sys/stat.h>
#include<sys/wait.h>
#include<sys/epoll.h>
//测试代码
//http 客户端代码
//主函数
int main()
{
    //创建TCP套接字
    int sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(sockfd < 0)
    {
        perror("socket");
        return -1;
    }
  //连接www.baidu.com服务器的80端口
  //域名解析函数www.baidu.com
  //定义一个，去接gethostbyname("www.baidu.com") 返回值
  struct hostent *host = gethostbyname("www.baidu.com");
  //判断域名解析是否成功
  if(host == NULL)
  {
      perror("gethostbyname error");
      return -1;
  }
  


  struct sockaddr_in addr;
  addr.sin_family = AF_INET; 
  addr.sin_port = htons(80);
 // 确保 h_addr_list 不为空
 
    if (host->h_addr_list && host->h_addr_list[0]) {
        addr.sin_addr = *(struct in_addr *)host->h_addr_list[0]; // 使用指针解引用赋值
        printf("IP address: %s\n", inet_ntoa(addr.sin_addr));
    } else {
        fprintf(stderr, "No address found for the host\n");
         return 1;
    }

 // addr.sin_addr = host->h_addr_list[0];
// addr.sin_addr = *(struct in_addr *)host->h_addr_list[0]; 
  if(connect(sockfd,(struct sockaddr*)&addr,sizeof(addr)) < 0)
  {
  }
    //发送HTTP请求
    char *buf = "GET / HTTP/1.1\r\nHost:www.baidu.com\r\n\r\n";
    send(sockfd,buf,strlen(buf),0);
    char *content = NULL;
    int content_response = NULL;
    char line[1024];
    //将套接字绑定在文件流上
    FILE *fp = fdopen(sockfd,"r");
    //按行读取HTTP相应
    while(fgets(line,sizeof(line),fp) != NULL)
    {
        //printf("%s",line);
        //遇到空行节结束循环
        if(strcmp(line,"\r\n") == 0)
        {
            break;
        }
        //根据冒号区分相应消息的头部字段和值
        char *p = strchr(line,':');
        if(p != NULL)
        {
            *p = '\0';//找到冒号，替换为0
         //   printf("%s: %s\n",line,p+1);//line 名字，p+1 值

        }
        //判断相应头部字段是否为Content-Length，如果是，则记录相应长度
        if(strcasecmp(line,"Content-Length") == 0)//不区大小写比较
        {
            //打印相应消息正文长度
            printf("Content-Length: %s\n",p+1);
           //分配正文的内存
           content_response = atoi(p+1);
           content = malloc(content_response);

        }
    }
    //读取响应消息正文
    while(content_response > 0)
    {
        int len = fread(content,1,content_response,fp);
        content_response -= len;
    }
    fclose(fp);
   //close(sockfd);
   //打印响应消息正文
   printf("%s\n",content);
  // printf("世界");
   free(content);

    return 0;
}

